﻿#pragma once
#include<iostream>
using namespace std;

#include<assert.h>

class Date
{
	//友元函数声明
	friend ostream& operator<<(ostream& out, const Date& d);
	friend istream& operator>>(istream& in, Date& d);

public:
	Date(int year = 2005, int month = 6, int day = 20);
	void Print() const;

	//频繁调用
	//内联函数
	int GetMonthDay(int year, int month)
	{
		assert(month > 0 && month < 13);
		
		//使用static定义静态数组，避免频繁调用时的重复创建
		static int monthDay[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };

		//区分二月天数
		//闰年
		if (month == 2 && (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
		{
			return 29;
		}
		//平年
		else
		{
			return monthDay[month];
		}
	}

	bool CheckDate();

    //运算符重载
	bool operator<(const Date& d) const;
	bool operator<=(const Date& d) const;
	bool operator>(const Date& d) const;
	bool operator>=(const Date& d) const;
	bool operator==(const Date& d) const;
	bool operator!=(const Date& d) const;
	
	//d += 天数
	Date& operator+=(int day);
	Date operator+(int day) const;
	//d -= 天数
	Date& operator-=(int day);
	Date operator-(int day) const;
	//d1 - d2
	int operator-(const Date& d) const;
	//++d
	Date& operator++();
	// d1++ -> d1.operator++(0)
    // 为了区分，构成重载，给后置++，强⾏增加了⼀个int形参
    // 这⾥不需要写形参名，因为接收值是多少不重要，也不需要⽤
    // 这个参数仅仅是为了跟前置++构成重载区分
	Date operator++(int);
	//--
	Date& operator--();
	Date operator--(int);

private:
	int _year;
	int _month;
	int _day;
};

// 重载
ostream& operator<<(ostream& out, const Date& d);
istream& operator>>(istream& in, Date& d);
